﻿using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Newtonsoft.Json; // 引入 Newtonsoft.Json 命名空间
using System.Windows.Forms;

namespace BoringTodo
{
    public partial class ChatForm : Form
    {
        // 初始化 HttpClient 用于发送 HTTP 请求
        private readonly HttpClient _httpClient = new HttpClient();
        // 定义 API 的请求地址
        private const string ApiUrl = "https://chat.zju.edu.cn/api/ai/v1/chat/completions";
        // 定义 API 密钥
        private const string ApiKey = "sk-XebFvwUclyXQanRM6a1aFa157f5c4b05A82a08925d6f0aBf";

        public ChatForm()
        {
            // 初始化窗体组件
            InitializeComponent();
            // 默认选择第一个模型
            radioButton1.Checked = true;
            // 为 textBox1 添加 KeyDown 事件处理程序
            textBox1.KeyDown += TextBox1_KeyDown;

            // 让窗口创建时位于屏幕中心
            this.StartPosition = FormStartPosition.CenterScreen;
        }

        /// <summary>
        /// 处理文本框按键事件，当按下 Enter 键时调用 BtnSubmit_Click 方法
        /// </summary>
        /// <param name="sender">触发事件的对象</param>
        /// <param name="e">事件参数</param>
        private void TextBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BtnSubmit_Click(sender, e);
                e.Handled = true;
                e.SuppressKeyPress = true;
            }
        }

        /// <summary>
        /// 处理提交按钮的点击事件，发送用户输入的问题到 API 并显示回复
        /// </summary>
        /// <param name="sender">触发事件的对象</param>
        /// <param name="e">事件参数</param>
        private async void BtnSubmit_Click(object sender, EventArgs e)
        {
            // 获取用户在文本框中输入的问题
            string userQuestion = textBox1.Text;
            // 检查用户输入是否为空，如果为空则直接返回
            if (string.IsNullOrEmpty(userQuestion))
            {
                return;
            }

            // 立刻将提问内容添加到富文本框中
            richTextBox1.AppendText($"你: {userQuestion}\n");
            richTextBox1.AppendText($"回复: ");

            try
            {
                string selectedModel;
                if (radioButton1.Checked)
                {
                    selectedModel = "deepseek-v3-671b";
                }
                else
                {
                    selectedModel = "deepseek-r1-671b";
                }

                var requestData = new
                {
                    // 使用用户选择的模型
                    model = selectedModel,
                    messages = new[]
                    {
                        new { role = "system", content = "You are a helpful assistant." },
                        new { role = "user", content = userQuestion }
                    },
                    stream = true
                };

                // 将请求数据序列化为 JSON 字符串
                string jsonData = JsonConvert.SerializeObject(requestData);
                // 创建 HTTP 请求内容，指定编码和媒体类型
                var httpContent = new StringContent(jsonData, Encoding.UTF8, "application/json");

                // 设置请求头的授权信息
                _httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", ApiKey);

                // 发送 POST 请求并等待响应
                HttpResponseMessage response = await _httpClient.PostAsync(ApiUrl, httpContent);

                if (response.IsSuccessStatusCode)
                {
                    // 读取响应内容
                    string responseContent = await response.Content.ReadAsStringAsync();
                    // 分割响应内容为多个数据块
                    string[] chunks = responseContent.Split(new[] { "data: " }, StringSplitOptions.RemoveEmptyEntries);
                    StringBuilder contentBuilder = new StringBuilder();

                    // 遍历每个数据块
                    foreach (string chunk in chunks)
                    {
                        try
                        {
                            // 将数据块反序列化为动态对象
                            var jsonObject = JsonConvert.DeserializeObject<dynamic>(chunk);
                            // 检查对象中是否包含回复内容
                            if (jsonObject?.choices?[0]?.delta?.content != null)
                            {
                                string contentStr = jsonObject.choices[0].delta.content;
                                if (!string.IsNullOrEmpty(contentStr))
                                {
                                    // 拼接回复内容
                                    contentBuilder.Append(contentStr);
                                }
                            }
                        }
                        catch (JsonException)
                        {
                            // 忽略 JSON 解析错误，继续处理下一个数据块
                            continue;
                        }
                    }
                    // 在富文本框中显示完整的回复内容
                    richTextBox1.AppendText($"{contentBuilder.ToString()}\n\n");
                }
                else
                {
                    // 显示请求失败的消息框
                    MessageBox.Show($"请求失败: {response.StatusCode}");
                }
            }
            catch (Exception ex)
            {
                // 显示发生错误的消息框
                MessageBox.Show($"发生错误: {ex.Message}");
            }
        }

        /// <summary>
        /// 重写 ProcessCmdKey 方法，处理按键命令
        /// </summary>
        /// <param name="msg">消息</param>
        /// <param name="keyData">按键数据</param>
        /// <returns>是否处理了按键命令</returns>
        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == Keys.Escape)
            {
                this.Close();
                return true;
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }
}